package demo.javax.servlet.http;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 监听器，从字面上可以看出listener主要用来监听用。通过listener可以监听web服务器中某一个执行动作，并根据其要求作出相应的响应。
 * 通俗的语言说就是在application，session，request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。
 * 
 * servlet2.4规范中提供了8个listener接口，可以将其分为三类，分别如下：
 * <li>第一类：与servletContext有关的listner接口。包括：ServletContextListener、ServletContextAttributeListener
 * <li>第二类：与HttpSession有关的Listner接口。包括：HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、
 * HttpSessionActivationListener；
 * <li>第三类：与ServletRequest有关的Listener接口，包括：ServletRequestListner、ServletRequestAttributeListener
 * 
 * <p>
 * servlet,filter都是针对url之类的，而listener是针对对象的操作的，如session的创建，session.setAttribute的发生，在这样的事件发生时做一些事情。
 * 可用来进行：Spring整合Struts,为Struts的action注入属性，web应用定时任务的实现，在线人数的统计等
 *
 */
@WebListener
public class ListenerDemo implements HttpSessionListener, ServletContextListener, ServletContextAttributeListener {

    private long onlineUserCount = 0;

    public long getOnlineUserCount() {
        return onlineUserCount;
    }

    /**
     * Default constructor.
     */
    public ListenerDemo() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent servletcontextevent) {
        // TODO Auto-generated method stub
    }

    /**
     * @see ServletContextAttributeListener#attributeAdded(ServletContextAttributeEvent)
     */
    public void attributeAdded(ServletContextAttributeEvent servletcontextattributeevent) {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
    public void sessionCreated(HttpSessionEvent httpsessionevent) {
        onlineUserCount++;
        toUpdateCount(httpsessionevent);
    }

    /**
     * @see ServletContextAttributeListener#attributeReplaced(ServletContextAttributeEvent)
     */
    public void attributeReplaced(ServletContextAttributeEvent servletcontextattributeevent) {
        System.err.println("...attributeReplaced...");
    }

    /**
     * @see ServletContextAttributeListener#attributeRemoved(ServletContextAttributeEvent)
     */
    public void attributeRemoved(ServletContextAttributeEvent servletcontextattributeevent) {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent httpsessionevent) {
        onlineUserCount--;
        toUpdateCount(httpsessionevent);
    }

    /**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent servletcontextevent) {
        // TODO Auto-generated method stub
    }

    private void toUpdateCount(HttpSessionEvent httpSessionEvent) {
        httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);
    }
}
